#!/usr/bin/env python3
"""
WMS Sample 客户端打包脚本 - 单文件版本
使用PyInstaller的onefile模式
"""

import os
import sys
import shutil
import subprocess
import json
from pathlib import Path
from datetime import datetime

def create_onefile_client():
    """创建单文件客户端"""
    
    app_name = "WMS_Client_OneFile"
    main_file = "client_gui.py"
    
    # 生成时间戳
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    package_name = f"{app_name}_v2.1.0_{timestamp}"
    deployment_dir = Path(package_name)
    
    print("=" * 50)
    print("WMS Sample 客户端单文件打包")
    print("=" * 50)
    print(f"创建部署包: {package_name}")
    
    try:
        # 清理构建文件
        cleanup_build_files()
        
        # 创建部署目录
        deployment_dir.mkdir(exist_ok=True)
        
        # 使用onefile模式打包
        if not build_onefile_executable(main_file, deployment_dir):
            return False
        
        # 复制配置文件
        copy_config_files(deployment_dir)
        
        # 创建启动脚本
        create_startup_scripts(deployment_dir, app_name)
        
        print(f"✅ 单文件客户端创建成功: {package_name}")
        return True
            
    except Exception as e:
        print(f"❌ 单文件客户端打包失败: {e}")
        return False

def cleanup_build_files():
    """清理构建文件"""
    print("\n=== 清理构建文件 ===")
    
    dirs_to_clean = ['build', 'dist']
    
    for dir_name in dirs_to_clean:
        if Path(dir_name).exists():
            shutil.rmtree(dir_name)
            print(f"✓ 清理目录: {dir_name}")

def build_onefile_executable(main_file, output_dir):
    """构建单文件可执行文件"""
    print("\n=== 打包单文件客户端程序 ===")
    
    try:
        # 使用干净环境的PyInstaller
        pyinstaller_path = "wms_clean_env/Scripts/pyinstaller.exe"
        if not Path(pyinstaller_path).exists():
            print(f"❌ 找不到干净环境的PyInstaller: {pyinstaller_path}")
            return False
        
        # 使用onefile模式打包
        cmd = [
            pyinstaller_path,
            '--onefile',
            '--windowed',  # GUI程序，不显示控制台
            '--clean',
            '--distpath', str(output_dir),
            '--name', 'WMS_Client',
            # 添加所有必要的隐藏导入
            '--hidden-import', 'tkinter',
            '--hidden-import', 'tkinter.ttk',
            '--hidden-import', 'tkinter.messagebox',
            '--hidden-import', '_tkinter',
            '--hidden-import', 'requests',
            '--hidden-import', 'urllib3',
            '--hidden-import', 'fastapi',
            '--hidden-import', 'pydantic',
            '--hidden-import', 'starlette',
            '--hidden-import', 'anyio',
            '--hidden-import', 'uvicorn',
            '--hidden-import', 'sqlalchemy',
            # 添加数据文件
            '--add-data', 'client_config.json;.',
            '--add-data', 'src;src',
            main_file
        ]
        
        print("正在打包单文件客户端程序...")
        print(f"执行命令: {' '.join(cmd)}")
        print("=" * 60)
        
        result = subprocess.run(cmd)
        
        if result.returncode == 0:
            print("=" * 60)
            print("✅ 单文件客户端程序打包成功")
            return True
        else:
            print(f"❌ 单文件客户端程序打包失败: 返回码 {result.returncode}")
            return False
            
    except Exception as e:
        print(f"❌ 单文件客户端程序打包失败: {e}")
        return False

def copy_config_files(deployment_dir):
    """复制配置文件"""
    print("\n=== 复制配置文件 ===")
    
    # 复制配置文件
    config_file = Path("client_config.json")
    if config_file.exists():
        shutil.copy2(config_file, deployment_dir)
        print(f"✓ 复制文件: {config_file}")

def create_startup_scripts(deployment_dir, app_name):
    """创建启动脚本"""
    print("\n=== 创建启动脚本 ===")
    
    # 主启动脚本
    startup_script = deployment_dir / "启动客户端.bat"
    startup_content = f'''@echo off
chcp 65001 >nul
title {app_name}

echo ========================================
echo    WMS Sample 客户端 v2.1.0
echo ========================================
echo.
echo 正在启动客户端程序...
echo.
echo 使用说明：
echo 1. 确保服务器已启动
echo 2. 在连接面板中配置服务器地址
echo 3. 点击"连接"按钮连接服务器
echo.
echo ========================================
echo.

WMS_Client.exe

echo.
echo 客户端已关闭
pause
'''
    
    with open(startup_script, 'w', encoding='utf-8') as f:
        f.write(startup_content)
    
    print("✅ 主启动脚本")

def main():
    """主函数"""
    create_onefile_client()

if __name__ == "__main__":
    main() 